package com.he.service;

import com.he.entity.LoginUser;
import com.he.entity.Role;
import com.he.enums.RoleEnum;
import com.he.utils.SecurityUtils;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Objects;
import java.util.Set;

/**
 * @author He
 * @version 1.0
 * @Date 2023/9/7 15:18
 * @Desc 自定义鉴权逻辑
 */
@Service("ps")
public class PermissionService {

    /**
     * 判断用户是否具有某权限
     * @param permission 权限字符串
     * @return 用户是否具有某权限
     */
    public boolean hasPermission(String permission){
        System.out.println(permission);
        LoginUser loginUser = SecurityUtils.getLoginUser();
        if (Objects.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getPermissions()) ||StringUtils.isEmpty(permission)) {
            return false;
        }
        //超级管理员拥有所有权限
        if (SecurityUtils.isAdmin()) {
            return true;
        }
        //否则获取当前登录用户的权限列表判断是否存在指定的权限
        List<String> permissions = SecurityUtils.getLoginUser().getPermissions();
        return permissions.contains(permission);
    }


    /*
    * 角色分割符
    * */
    private static final String ROLE_DELIMETER = ",";


    /*
    * 权限分割符
    * */
    private static final String PERMISSION_DELIMETER = ",";

    /**
     * 判断用户是否具有permissions中的任意一个权限
     * @param permissions 用户权限列表
     * @return 用户是否具有permissions中的任意一个权限
     */
    public boolean hasAnyPermission(String permissions) {
        LoginUser loginUser = SecurityUtils.getLoginUser();
        if (Objects.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getPermissions()) ||StringUtils.isEmpty(permissions)) {
            return false;
        }
        //超级管理员拥有所有权限
        if (SecurityUtils.isAdmin()) {
            return true;
        }
        List<String> authorities = loginUser.getPermissions();
        for (String permission : permissions.split(PERMISSION_DELIMETER)) {
            if (!StringUtils.isEmpty(permission) && authorities.contains(permission)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 判断用户是否具有某权限，与 hasPermission 逻辑相反。
     * @param permissions 权限字符串
     * @return 用户是否不具有某权限
     */
    public boolean hasAllPermissions(String permissions) {
        LoginUser loginUser = SecurityUtils.getLoginUser();
        if (Objects.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getPermissions()) || StringUtils.isEmpty(permissions)) {
            return false;
        }
        // 超级管理员拥有所有权限
        if (SecurityUtils.isAdmin()) {
            return true;
        }
        List<String> authorities = loginUser.getPermissions();
        String[] permissionArray = permissions.split(PERMISSION_DELIMETER);
        // 遍历指定的所有权限，如果用户不具备其中任何一个权限，返回 false
        for (String permission : permissionArray) {
            if (StringUtils.isNotEmpty(permission) && !authorities.contains(permission)) {
                return false;
            }
        }
        // 用户具备所有指定的权限
        return true;
    }


    /**
     * 判断用户是否拥有某个角色
     * @param role 角色字符串
     * @return 用户是否具备某角色
     */
    public boolean hasRole(String role) {
        LoginUser loginUser = SecurityUtils.getLoginUser();
        if (Objects.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getRoles()) || StringUtils.isEmpty(role)) {
            return false;
        }
        for (String userRole : loginUser.getRoles()) {
            if (SecurityUtils.isAdmin() || userRole.equals(StringUtils.trim(role))) {
                return true;
            }
        }
        return false;
    }

    /**
     * 验证用户是否不具备某角色，与 isRole逻辑相反。
     * @param role 角色名称
     * @return 用户是否不具备某角色
     */
    public boolean lacksRole(String role) {
        return hasRole(role) != true;
    }

    /**
     * 验证用户是否具有以下任意一个角色
     * @param roles 以 ROLE_NAMES_DELIMETER 为分隔符的角色列表
     * @return 用户是否具有以下任意一个角色
     */
    public boolean hasAnyRoles(String roles) {
        LoginUser loginUser = SecurityUtils.getLoginUser();
        if (Objects.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getRoles()) || StringUtils.isEmpty(roles)) {
            return false;
        }
        for (String role : roles.split(ROLE_DELIMETER)) {
            if (hasRole(role)) {
                return true;
            }
        }
        return false;
    }

}
